wayland: Properly support changing of surface scale
authorJonas Ådahl <jadahl@gmail.com>
Tue, 24 Feb 2015 08:11:48 +0000 (16:11 +0800)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 25 Feb 2015 01:22:02 +0000 (20:22 -0500)
When the preferred surface scale changes, for example when entering a
wl_output with a higher scale than any previous entered output, recreate
the shm surface and redraw the window content with the new window scale.

Before this patch, the internal scale would be changed, but the shm
surface would not be recreated given the new scale, i.e. we'd attach a
buffer for a different scale than wl_surface.set_scale specified.

https://bugzilla.gnome.org/show_bug.cgi?id=745076

gdk/wayland/gdkwindow-wayland.c

index 76b07299bb07366cc5348b244cf4f25c6c979b24..547aca51ac2ea4083c587f354fdf3bf4f1743125 100644 (file)
@@ -140,7 +140,8 @@ struct _GdkWindowImplWaylandClass
 
 static void gdk_wayland_window_configure (GdkWindow *window,
                                           int        width,
-                                          int        height);
+                                          int        height,
+                                          int        scale);
 
 GType _gdk_window_impl_wayland_get_type (void);
 
@@ -162,7 +163,8 @@ _gdk_window_impl_wayland_init (GdkWindowImplWayland *impl)
 static void
 gdk_wayland_window_update_size (GdkWindow *window,
                                 int32_t    width,
-                                int32_t    height)
+                                int32_t    height,
+                                int        scale)
 {
   GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
   GdkRectangle area;
@@ -176,6 +178,7 @@ gdk_wayland_window_update_size (GdkWindow *window,
 
   window->width = width;
   window->height = height;
+  impl->scale = scale;
 
   if (impl->egl_window)
     wl_egl_window_resize (impl->egl_window, width, height, 0, 0);
@@ -418,13 +421,10 @@ window_update_scale (GdkWindow *window)
       scale = MAX (scale, output_scale);
     }
 
-  if (scale != impl->scale)
-    {
-      impl->scale = scale;
-
-      /* Notify app that scale changed */
-      gdk_wayland_window_configure (window, window->width, window->height);
-    }
+  /* Notify app that scale changed */
+  gdk_wayland_window_configure (window,
+                                window->width, window->height,
+                                scale);
 }
 
 static void
@@ -621,12 +621,16 @@ gdk_window_impl_wayland_finalize (GObject *object)
 static void
 gdk_wayland_window_configure (GdkWindow *window,
                               int        width,
-                              int        height)
+                              int        height,
+                              int        scale)
 {
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
   GdkDisplay *display;
   GdkEvent *event;
 
-  if (window->width == width && window->height == height)
+  if (window->width == width &&
+      window->height == height &&
+      impl->scale == scale)
     return;
 
   event = gdk_event_new (GDK_CONFIGURE);
@@ -635,7 +639,7 @@ gdk_wayland_window_configure (GdkWindow *window,
   event->configure.width = width;
   event->configure.height = height;
 
-  gdk_wayland_window_update_size (window, width, height);
+  gdk_wayland_window_update_size (window, width, height, scale);
   _gdk_window_update_size (window);
 
   display = gdk_window_get_display (window);
@@ -859,7 +863,7 @@ xdg_surface_configure (void               *data,
                                  &width,
                                  &height);
 
-      gdk_wayland_window_configure (window, width, height);
+      gdk_wayland_window_configure (window, width, height, impl->scale);
     }
 
   wl_array_for_each(p, states)
@@ -1312,12 +1316,10 @@ gdk_window_wayland_move_resize (GdkWindow *window,
                                 gint       width,
                                 gint       height)
 {
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
   if (with_move)
     {
-      GdkWindowImplWayland *impl;
-
-      impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
-
       /* Each toplevel has in its own "root" coordinate system */
       if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_TOPLEVEL)
         {
@@ -1336,7 +1338,7 @@ gdk_window_wayland_move_resize (GdkWindow *window,
    * just move the window - don't update its size
    */
   if (width > 0 && height > 0)
-    gdk_wayland_window_configure (window, width, height);
+    gdk_wayland_window_configure (window, width, height, impl->scale);
 }
 
 static void
@@ -2074,7 +2076,7 @@ gdk_wayland_window_set_shadow_width (GdkWindow *window,
     (impl->margin_left + impl->margin_right) + (left + right);
   new_height = window->height -
     (impl->margin_top + impl->margin_bottom) + (top + bottom);
-  gdk_wayland_window_configure (window, new_width, new_height);
+  gdk_wayland_window_configure (window, new_width, new_height, impl->scale);
 
   impl->margin_left = left;
   impl->margin_right = right;